### Python 推导式是一种独特的数据处理方式，可以从一个数据序列构建另一个数据序列的结构体:
    # Python 支持的各种数据结构的推导式：列表（list）推导式、dict、set、tuple


### list推导式

# 格式
# [ 表达式 for 变量 in 列表]   [out_exp_res for out_exp in input_list]
# or [ 表达式 for 变量 in 列表 if条件]  [out_exp_res for out_exp in input_list if condition]
        # out_exp_res: 列表生成元素表达式，可以是有返回值的函数
        # for out_exp in input_list: 迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中
        # if condition ： 条件语句，过滤列表中不符合条件的值


# 计算30以内可以被3整除的除数
a = [i for i in range(30) if i % 3 == 0]
print(a ,type(a))


### dict推导式

# 格式
# { key_expr: value_expr for value in collection } or { key_expr: value_expr for value in collection if condition}

# 实例
list = ['Google','Baidu','Taobao']
# 将列表中各字符串值为键，各字符串的长度为值，组成键值对
dict = { key:len(key) for key in list }
print(dict)

# 提供三个数字，以三个数字为键，三个数字的平方为值来创建字典
newdict = {x:x**2 for x in(2,3,4)}
print('\n',newdict,type(newdict))


### 集合推导式

# 格式
# { expression for item in Sequence} or { expression for item in Sequence if condition}

# 计算数字1，2，3的平方数
newset = {x**2 for x in (1,2,3)}   # x:x**2,就是键值对的形式，输出的数据类型就为dict
print('\n',newset,type(newset))

# 判断不是abc的字母并输出
set = { i for i in 'abcdjkadaxccaabcabcjjcababc' if i not in 'abc'}
print(set,type(set))


###  元组推导式

# 格式
# { expression for item in Sequence} or { expression for item in Sequence if condition}
# 元组推导式和列表推导式的用法也完全相同，只是元组推导式是用 () 圆括号将各部分括起来，而列表推导式用的是中括号 []，另外元组推导式返回的结果是一个生成器对象。

# 生成一个包含数字 1~9 的元组
tuple1 = (i for i in range(1,10))
print('\n',tuple,type(tuple))  # 返回的生成器对象
newtuple = tuple(tuple1)     # 使用 tuple() 函数，可以直接将生成器对象转换成元组
print(newtuple,'\n')


list1 = ['python', 'test1', 'test2']
list2 = [word.title() if word.startswith('p') else word.upper() for word in list1] # title()函数:python中字符串函数，返回’标题化‘的字符串，就是单词的开头为大写，其余为小写
print('\n\n',list2)
